package com.ztesoft.web.checkup.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.ztesoft.core.spring.context.SpringApplicationContextHolder;
import com.ztesoft.framework.log.ZTEsoftLogManager;
import com.ztesoft.web.baseconfig.db.po.DmPlanPO;
import com.ztesoft.web.baseconfig.db.po.DmSrcTablePO;
import com.ztesoft.web.baseconfig.db.po.DmStrategyPO;
import com.ztesoft.web.checkup.service.CheckUpService;
import com.ztesoft.web.checkup.service.CheckUpStrategy;
import com.ztesoft.web.common.DMSConstant;
import com.ztesoft.web.common.customdb.dao.DmPlanCustomDao;
import com.ztesoft.web.common.customdb.dao.DmSrcTableCustomDao;
import com.ztesoft.web.common.customdb.dao.DmStrategyCustomDao;
import com.ztesoft.web.common.customdb.dao.DmTaskStageCustomDao;
import com.ztesoft.web.filecommon.db.dao.DmSrcFileDao;
import com.ztesoft.web.filecommon.db.po.DmSrcFilePO;
import com.ztesoft.web.taskgenerator.db.dao.DmTaskDao;
import com.ztesoft.web.taskgenerator.db.po.DmTaskPO;

@Service
public class CheckUpServiceImpl implements CheckUpService{
	
	/**
	 * 日志
	 */
    private static final ZTEsoftLogManager LOGGER = ZTEsoftLogManager
            .getLogger(CheckUpServiceImpl.class);

	@Autowired
	private DmSrcFileDao dmSrcFileDao;
	
	@Autowired
	private CheckUpFileServiceImpl checkUpFileServiceImpl;
	
	@Autowired
	private DmPlanCustomDao planCustomDao;
	
	@Autowired
	private DmSrcTableCustomDao srcTableCustomDao;
	
	@Autowired
	private DmStrategyCustomDao strategyDao;

	@Autowired
	private DmTaskStageCustomDao taskStageCustomDao;
	
	@Autowired
	private DmTaskDao taskDao;
	
	private CheckUpStrategy checkUpStrategy;
	
	@Override
	public String notransCheckUp(int taskId, int strategyId) {
		
		LOGGER.info("|++===体检服务|任务ID={0},策略ID={1} BEGIN..===++|", taskId, strategyId);

		LOGGER.debug("|查询计划实例|taskId={0}", taskId);
		DmPlanPO planPO = planCustomDao.selectByTaskId(taskId);
		
		LOGGER.debug("|查询任务实例|taskId={0}", taskId);
		DmTaskPO taskPO = taskDao.selectByPrimaryKey(taskId);
		LOGGER.debug("|查询数据管理策略|strategyId={0}", strategyId);
		DmStrategyPO strategyPO = strategyDao.selectTopSeqPOById(strategyId);
		LOGGER.debug("|查询策略下的主对象信息|strategyId={0}", strategyPO.getDmStrategyId());
		if (DMSConstant.SOURCE_TYPE_TABLE == (int)planPO.getSourceType()) {
			DmSrcTablePO srcTablePO = srcTableCustomDao.selectByStrategyId(strategyPO.getDmStrategyId());
			if (DMSConstant.ARCHIVE_MODE_CONDITION == srcTablePO.getArchiveMode()) {
				checkUpStrategy = SpringApplicationContextHolder.getBean(CheckUpStrategyCondition.class);
			} else if (DMSConstant.ARCHIVE_MODE_WHOLETABLE == srcTablePO.getArchiveMode()) {
				checkUpStrategy = SpringApplicationContextHolder.getBean(CheckUpStrategyWhole.class);
			} else if (DMSConstant.ARCHIVE_MODE_SUBAREA == srcTablePO.getArchiveMode()) {
				checkUpStrategy = SpringApplicationContextHolder.getBean(CheckUpStrategyPartition.class);
			}
			return checkUpStrategy.checkUp(planPO, taskPO, strategyPO, srcTablePO);
		} else if ((int)planPO.getSourceType() == DMSConstant.SOURCE_TYPE_FILE) {
			checkUpFileServiceImpl = SpringApplicationContextHolder.getBean(CheckUpFileServiceImpl.class);
			DmSrcFilePO srcFilePO = dmSrcFileDao.selectBydmStrategyId(strategyPO.getDmStrategyId());
			//TODO
			return checkUpFileServiceImpl.checkUp(planPO, taskPO, strategyPO, srcFilePO);

		}
		return DMSConstant.Status.SUCCESS.getState();
	}
	
//	private String notransCheckUpTable(DmTaskPO taskPO, DmSrcTablePO src, DmStrategyPO strategyPO, List<DmTaskStageDto> taskStageList, DmPlanPO planPO) {
//		Connection conn = null;
//		ResultSet rs = null;
//		String[] dbConfig = null;
//		String checkState = "00A";
//
//			if (src.getArchiveMode() == DMSConstant.ARCHIVE_MODE_WHOLETABLE) {

//			
//		} else if (src.getArchiveMode() == DMSConstant.ARCHIVE_MODE_SUBAREA) { // 分区归档
//			if (dbConfig[0].equalsIgnoreCase("oracle")) { //TODO
//				//
//				for (DmTaskStageDto taskStagePO : taskStageList) {				
//					taskStagePO.setTaskStartTime((taskStagePO.getTaskStartTime()!=null)?null:DateUtils.getDBCurrentTime());
//					taskStagePO.setTaskEndTime(null);//避免带入条件
//					taskStagePO.setCheckDataSize(null);
//					taskStagePO.setErrorDesc(null);
//					taskStagePO.setStage(null);
//					taskStageCustomDao.updateTaskStageState(taskStagePO);
//				}
//				PreparedStatement ps = null;
//				ResultSet rst = null;
//				List<String> partList = null;
//				String sql = "SELECT PARTITION_NAME FROM USER_TAB_PARTITIONS where table_name=?";
//				try {
//					partList = new ArrayList<String>(5);
//					conn = DataSourceUtils.getConnection(ds);
//					ps = conn.prepareStatement(sql);
//					ps.setString(1, src.getTableName());//单表
//					rst = ps.executeQuery();
//					while (rst.next()) {
//						partList.add(rst.getString(1));
//					}
//				} catch (SQLException e) {
//					LOGGER.error("", e);
//					DmTaskStageDto po = taskStageList.get(0);
//					po.setTaskStartTime(null);
//					po.setState("00F");
//					po.setStateDate(DateUtils.getDBCurrentTime());
//					po.setTaskEndTime(DateUtils.getDBCurrentTime());
//					po.setCheckObjName(null);//更新策略下所有
//					po.setStage(null);
//					po.setErrorDesc("查询分区异常"+e.toString());
//					taskStageCustomDao.updateTaskStageState(po);//
//					return "00F";
//				} finally {
//					JdbcUtils.closeStatement(ps);
//					JdbcUtils.closeResultSet(rs);
//					DataSourceUtils.releaseConnection(conn, ds);
//				}
//				LOGGER.info("查询分区集合|{0}|",partList);
//				//查询记录
//				int resultCount = 0;
//				try {
//					conn = DataSourceUtils.getConnection(ds);
//					sql = SQLHelper.selectCount(src.getTableName(), null, null, "oracle");
//					ps = conn.prepareStatement(sql);
//					rst = ps.executeQuery();
//					if (rst.next()) {
//						resultCount = rst.getInt(1);
//					}
//				} catch (SQLException e) {
//					LOGGER.error("", e);
//				} finally {
//					JdbcUtils.closeStatement(ps);
//					JdbcUtils.closeResultSet(rst);
//					DataSourceUtils.releaseConnection(conn, ds);
//				}
//				LOGGER.info("源表{0}数据count:{1}",src.getTableName(), resultCount);
//				DmTargetTableArg dmTargetTableArg = new DmTargetTableArg();
//				DmTargetTableArg.DmTargetTableCriteria targetTableCriteria = dmTargetTableArg.createCriteria();
//				targetTableCriteria.andSourceDataIdEqualTo(src.getSourceDataId());
//				DmTargetTablePO targetPO = targetTableDao.selectByArg(dmTargetTableArg).get(0);
//				List<String> sqlList = new ArrayList<String>(5);
//				for (String partStr : partList) {
//					String changeSql = "alter table $source_table_name exchange partition  $partition_name with table $dest_table_name";
//					changeSql = changeSql.replace("$source_table_name", src.getTableName());
//					changeSql = changeSql.replace("$partition_name", partStr);
//					changeSql = changeSql.replace("$dest_table_name", targetPO.getTableName());
//					sqlList.add(changeSql);
//				}
//				if (Utils.notEmpty(sqlList)) {
//					try {
//						conn = DataSourceUtils.getConnection(ds);
//						for (String changeSql : sqlList) {
//							ps = conn.prepareStatement(changeSql);
//							ps.execute();
//						}
//					} catch (SQLException e) {
//						LOGGER.error("置换表分区异常", e);
//						DmTaskStageDto po = taskStageList.get(0);
//						po.setTaskStartTime(null);
//						po.setState("00F");
//						po.setStateDate(DateUtils.getDBCurrentTime());
//						po.setTaskEndTime(DateUtils.getDBCurrentTime());
//						po.setCheckObjName(null);//更新策略下所有
//						po.setStage(null);
//						po.setErrorDesc("置换表分区异常"+e.toString());
//						taskStageCustomDao.updateTaskStageState(po);//
//						return "00F";
//					} finally {
//						JdbcUtils.closeStatement(ps);
//						DataSourceUtils.releaseConnection(conn, ds);
//					}
//				}
//				
//				LOGGER.info("置换分区成功");
//				//查询记录 再次查询确认数据
//				int cgResult = 0;
//				try {
//					conn = DataSourceUtils.getConnection(ds);
//					sql = SQLHelper.selectCount(src.getTableName(), null, null, "oracle");
//					ps = conn.prepareStatement(sql);
//					rst = ps.executeQuery();
//					if (rst.next()) {
//						cgResult = rst.getInt(1);
//						if (cgResult != 0) {
//							throw new SQLException("置换分区异常，分区未置换成功");
//						}
//					}
//				} catch (SQLException e) {
//					LOGGER.error("", e);
//					DmTaskStageDto po = taskStageList.get(0);
//					po.setTaskStartTime(null);
//					po.setState("00F");
//					po.setStateDate(DateUtils.getDBCurrentTime());
//					po.setTaskEndTime(DateUtils.getDBCurrentTime());
//					po.setCheckObjName(null);//更新策略下所有
//					po.setStage(null);
//					po.setErrorDesc("置换表分区未能成功"+e.toString());
//					taskStageCustomDao.updateTaskStageState(po);//
//					return "00F";
//				} finally {
//					JdbcUtils.closeStatement(ps);
//					JdbcUtils.closeResultSet(rst);
//					DataSourceUtils.releaseConnection(conn, ds);
//				}
//				//更新数据
//				for (DmTaskStageDto po : taskStageList) {	
//					po.setTaskStartTime(null);
//					po.setState("00A");
//					po.setStateDate(DateUtils.getDBCurrentTime());
//					po.setTaskEndTime(DateUtils.getDBCurrentTime());
//					po.setStage(null);
//					po.setErrorDesc(null);
//					po.setIsCheck(0);//默认审批通过
//					po.setCheckCount(resultCount);
//					po.setTotalRecordCount(resultCount);
//					po.setCheckDataSize(toBigDecimal(src.getOneRecordSize(), resultCount, 2));
//					po.setTotalDataSize(po.getCheckDataSize());
//					taskStageCustomDao.updateTaskStageState(po);//
//				}
//				checkState = "50E";
//			} else if (dbConfig[0].equalsIgnoreCase("informix") || dbConfig[0].equalsIgnoreCase("mysql")) {
//				checkUpByCondition(taskStageList, planPO, taskPO, strategyPO, src);
//			}
//		}
//		return checkState;
//	}

}
